﻿using System;

namespace Util
{
    /// <summary>
    /// 消息中心接口（事件总线接口）
    /// </summary>
    public interface IMessagingCenter
    {
        /// <summary>
        /// 在 subscriber 上运行 callback 以响应名为 message 且由 source 创建的消息。
        /// </summary>
        /// <typeparam name="TSender">发送消息的对象的类型。</typeparam>
        /// <param name="subscriber">订阅消息的对象。 通常情况下，这是使用订阅对象中使用的 this 关键字指定的。</param>
        /// <param name="message">将发送给正在从类型 TSender 的实例侦听消息的对象的消息。</param>
        /// <param name="callback">一个回调，它将发送方和实参作为形参，在订阅方收到消息时运行。</param>
        /// <param name="source">将发送消息的对象。</param>
        void Subscribe<TSender>(object subscriber, string message, Action<TSender> callback, TSender source = null) where TSender : class;

        /// <summary>
        /// 在 subscriber 上运行 callback 以响应名为 message 且由 source 创建的参数化消息。
        /// </summary>
        /// <typeparam name="TSender">发送消息的对象的类型。</typeparam>
        /// <typeparam name="TArgs">用作消息的消息参数的对象的类型。</typeparam>
        /// <param name="subscriber">订阅消息的对象。 通常情况下，这是使用订阅对象中使用的 this 关键字指定的。</param>
        /// <param name="message">将发送给正在从类型 TSender 的实例侦听消息的对象的消息。</param>
        /// <param name="callback">一个回调，它将发送方和实参作为形参，在订阅方收到消息时运行。</param>
        /// <param name="source">将发送消息的对象。</param>
        void Subscribe<TSender, TArgs>(object subscriber, string message, Action<TSender, TArgs> callback, TSender source = null) where TSender : class;

        /// <summary>
        /// 取消订阅指定的无参数订阅服务器消息。
        /// </summary>
        /// <typeparam name="TSender">发送消息的对象的类型。</typeparam>
        /// <param name="subscriber">订阅消息的对象。 通常情况下，这是使用订阅对象中使用的 this 关键字指定的。</param>
        /// <param name="message">将发送给正在从类型 TSender 的实例侦听消息的对象的消息。</param>
        void Unsubscribe<TSender>(object subscriber, string message) where TSender : class;

        /// <summary>
        /// 取消订阅来自指定发件人的指定消息的订阅服务器。
        /// </summary>
        /// <typeparam name="TSender">发送消息的对象的类型。</typeparam>
        /// <typeparam name="TArgs">用作消息的消息参数的对象的类型。</typeparam>
        /// <param name="subscriber">订阅消息的对象。 通常情况下，这是使用订阅对象中使用的 this 关键字指定的。</param>
        /// <param name="message">将发送给正在从类型 TSender 的实例侦听消息的对象的消息。</param>
        void Unsubscribe<TSender, TArgs>(object subscriber, string message) where TSender : class;

        /// <summary>
        /// 发送没有参数的命名消息。
        /// </summary>
        /// <typeparam name="TSender">发送消息的对象的类型。</typeparam>
        /// <param name="sender">发送消息的实例。 通常情况下，这是使用发送对象中使用的 this 关键字指定的。</param>
        /// <param name="message">将发送给正在从类型 TSender 的实例侦听消息的对象的消息。</param>
        void Send<TSender>(TSender sender, string message) where TSender : class;

        /// <summary>
        /// 使用指定的参数发送命名消息。
        /// </summary>
        /// <typeparam name="TSender">发送消息的对象的类型。</typeparam>
        /// <typeparam name="TArgs">用作消息的消息参数的对象的类型。</typeparam>
        /// <param name="sender">发送消息的实例。 通常情况下，这是使用发送对象中使用的 this 关键字指定的。</param>
        /// <param name="message">将发送给正在从类型 TSender 的实例侦听消息的对象的消息。</param>
        /// <param name="args">将传递给侦听器的回调的参数。</param>
        void Send<TSender, TArgs>(TSender sender, string message, TArgs args) where TSender : class;
    }
}
